iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0

統整

統整內容為進制轉換、資料型別、base64編碼實作

-----

進制

如果為n進制,代表以n為底,如數字到n便要進位

進制 英文 前綴(辨識) 例子
十進位 Decimal 8745
二進位 Binary 0b (0b)10001000101001
八進位 octal 0o (0o)21051
十六進位 hex 0x (0x)2229

-----

十進轉二、八、十六

  • 利用bin()、oct()、hex()
  • Code
a = 8745
print("Dec : ", a)
print("Bin : ", bin(a)) # Dec to Bin
print("Oct : ", oct(a)) # Dec to Oct
print("Hex : ", hex(a)) # Dec to Hex 
  • Output
    https://ithelp.ithome.com.tw/upload/images/20230914/20162613GGd1dSnku1.png

-----

二、八、十六進轉十

  • 利用int() ((要記得加前綴(e.g. 0b、0o、0x))
  • Code
a = 0b10001000101001
b = 0o21051
c = 0x2229
print("Dec : ", int(a)) # Bin to Dec
print("Dec : ", int(b)) # Oct to Dec
print("Dec : ", int(c)) # Hex to Dec
  • Output
    https://ithelp.ithome.com.tw/upload/images/20230914/20162613y6Mu7VYmvA.png

-----

型別

資料型別 中文 例子
int 整數 78763
str 字串 "78763"
bytes 字節 b'\x013\xab'

-----

常用函式庫

from Crypto.Util.number import *

-----

int to str&bytes

  • 使用str()、long_to_bytes()
  • Code
from Crypto.Util.number import *

a = 78763
print(str(a)) # int to str
print(type(str(a)))
print(long_to_bytes(a)) # int to bytes
print(type(long_to_bytes(a)))

  • type(a)為輸出a的型別
  • output
    https://ithelp.ithome.com.tw/upload/images/20230914/201626132S9pD9GmYb.png

-----

Bytes&str to int

  • 使用int()、bytes_to_long()
  • code
from Crypto.Util.number import *

a = "78763"
b = b'\x013\xab'
print(int(a)) # str to int
print(type(int(a)))
print(bytes_to_long(b)) # bytes to int
print(type(bytes_to_long(b)))
  • output
    https://ithelp.ithome.com.tw/upload/images/20230914/20162613fmYZHbnTDG.png

-----

str & bytes

一張圖解釋!
https://ithelp.ithome.com.tw/upload/images/20230914/20162613R1EC2Lixmx.png

  • code
str = '早安Zer0Cat'
str_bytes = str.encode() # str to bytes
print("str :", str)
print("bytes :", str_bytes)
print("str :", str_bytes.decode()) #bytes to str
  • output
    https://ithelp.ithome.com.tw/upload/images/20230914/20162613Tccsu61hkD.png

-----

hexstr&bytes

  • 使用.hex()&bytes_fromhex()
str = "Hello"
bytes_str = str.encode()# str to bytes
print("bytes :", bytes_str)
###
print("hex :", bytes_str.hex())# bytes to hex
hex_str = bytes_str.hex()
print("bytes :", bytes.fromhex(hex_str))# hex to bytes
  • Output
    https://ithelp.ithome.com.tw/upload/images/20230914/20162613qx7jLzU2Qx.png

-----

常見編碼

Base64

  • 基於64個可列印字元來表示二進位資料的表示方法
  • 6bit為一單位,對應某可列印字元
  • 會把資料以每3bytes為1單位,如不足則補0

有點抽象對吧,沒4,來個栗子!

https://ithelp.ithome.com.tw/upload/images/20230914/20162613lPAazeW45K.jpg

  • 目標 : 把 ”Man” base64編碼
    因base64是用來表示二進位資料的,由此可知,先把Man轉成二進位!
    (把Man各字元先ord()得出ASCII碼,之後再利用bin()得二進位)
  • Code
str = "Man"
for i in str :
    print(f"{i} bin : {bin(ord(i))}")
  • Output
    https://ithelp.ithome.com.tw/upload/images/20230914/20162613p9Rt8TJshA.png

一個英文字母 = 1 bytes = 8 bit ,Man = 3bytes = 24bit,所以應該要有24個數字,把剛剛的output接在一起驗證看看!

https://ithelp.ithome.com.tw/upload/images/20230914/20162613wgl89Rb17P.png

真的是24個!接下來要以6bit為單位,來得出索引,之後去對應表便可成功編碼

  • Code
chr_1 = "010011"
chr_2 = "010110"
chr_3 = "000101"
chr_4 = "101110"
print("1. ", int(chr_1, 2))
print("2. ", int(chr_2, 2))
print("3. ", int(chr_3, 2))
print("4. ", int(chr_4, 2))

  • int(變數, 2)的意思代表此變數為二進位,同理可改成8、16
  • output
    https://ithelp.ithome.com.tw/upload/images/20230914/20162613ICakfw77Uw.png

可得此表格
https://ithelp.ithome.com.tw/upload/images/20230914/20162613IH8eGs5Uuz.png

利用索引值去對應base64 table
https://ithelp.ithome.com.tw/upload/images/20230914/20162613pOndQfkInl.png

  • 可得TWFu

成功編碼!
https://ithelp.ithome.com.tw/upload/images/20230914/20162613H5iIBUnhEV.png

不過我們還是來使用python驗證一下(使用base64.b64encode())

  • Code
import base64

str = b"Man"
print("base64 :", base64.b64encode(str))

  • Output
    https://ithelp.ithome.com.tw/upload/images/20230914/20162613r9bbxbcVZA.png

正確無誤!

恩…好像還少了一點什麼......阿!如果不是剛好3bytes怎麼辦,什麼是補0?好,我們再來個栗子!

  • 目標 : 把”A” Base64編碼
    最後可得此圖,紅色0就是補0的意思,因為是以3bytes為單位,所以後面雖然沒有資料,但還是要是0,且編碼後為”=
    https://ithelp.ithome.com.tw/upload/images/20230914/20162613Eo7pFbdFDA.png

  • 編碼結果可得QQ==
    以防萬一,再來驗證一次!這次我們使用線上工具( https://www.base64encode.org/ ), 結果與我們編碼出來的相同( •̀ ω •́ )✧
    https://ithelp.ithome.com.tw/upload/images/20230914/201626131P6xlKkV4A.png

-----

url編碼

會把網址列的一些符號用%表示
https://ithelp.ithome.com.tw/upload/images/20230914/20162613avtwtax7hy.png

-----

aaencode

-----

小結

今天統整了昨天所學,且去認識到其他的編碼方式,明天會繼續往下解題,進入XOR的領域!

-----


上一篇
【Day 3】Introduction to CryptoHack 02 – Encode
下一篇
【Day 5】XOR基礎筆記
系列文
資安小白的密碼學從0到1-CryptoHack平台解題紀錄31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言